#ifndef VEC_OPERATION_HPP
#define VEC_OPERATION_HPP

#include "tvector.hpp"

template <typename T, ui8 col>
T dot( const tvec<T, col> &a, const tvec<T, col> &b ) {
  T r = T();
  LOOP_TVEC( r += a[i] * b[i]; )
  return r;
}

template <typename T>
tvec<T, 3> cross( tvec<T, 3> &a, tvec<T, 3> &b ) {
  tvec<T, 3> v;
  v.x = a.y * b.z - a.z * b.y;
  v.y = a.z * b.x - a.x * b.z;
  v.z = a.x * b.y - a.y * b.x;
  return v;
}

template <typename T, ui8 col>
void clamp( tvec<T, col> &v, T min, T max ) {
  LOOP_TVEC( v[i] = v[i] <= min ? min : ( v[i] >= max ? max : v[i] ); )
}

template <typename T, ui8 col>
tvec<T, col> minVec( const tvec<T, col> &v1, const tvec<T, col> &v2 ) {
  tvec<T, col> r;
  LOOP_TVEC( r[i] = v1[i] < v2[i] ? v1[i] : v2[i]; )
  return r;
}

template <typename T, ui8 col>
tvec<T, col> maxVec( const tvec<T, col> &v1, const tvec<T, col> &v2 ) {
  tvec<T, col> r;
  LOOP_TVEC( r[i] = v1[i] > v2[i] ? v1[i] : v2[i]; )
  return r;
}

template <typename T, ui8 col>
tvec<T, col> normalize( const tvec<T, col> &v ) {
  tvec<T, col> r = v;
  r.normalized();
  return r;
}

#endif